import logging
import time
import unittest
from time import sleep

import requests
from parameterized import parameterized

import utils
from api.reg_login_api import RegLoginApi


class TestRegLogin(unittest.TestCase):
    @classmethod
    #用户信息的初始化(用户信息的清洗) 类级别的初始化方法
    def setUpClass(cls) -> None:
        #调用封装的用户信息清洗的方法
        utils.clear_user_info()


     #实例化 方法级别 ( 接口之间没有关联,用方法级每一次运行一次)
    def setUp(self) -> None:
        #创建session对象
        self.session = requests.session()

        #实例化封装接口的类
        self.reg_login_api = RegLoginApi(self.session)

    def tearDown(self) -> None:
        #关闭session 对象
     self.session.close()


    # 获取图片验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data","img_verify_code"))
    def test01_img_verify_code(self,r,exp_status_code):
        #调用封装的方法实现接口请求,获取响应数据
              #调用实例化封装接口的类
        res = self.reg_login_api.get_img_verify_code(r)
        logging.info("获取图片验证码响应状态码{}".format(res.status_code))
        logging.info("获取图片验证码的接口的url{}".format(res.url))
        #获取响应头信息
        # res_headers = res.headers
        # print(res_headers)
        #断言
        #断言状态码
        self.assertEqual(exp_status_code,res.status_code)

    # 获取短信验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data","phone_verify_code"))
    def test02_phone_verify_code(self,phone,imgVerifyCode,exp_status_code,exp_status,exp_description):
        # 上一个接口获取的cookie (获取图片验证码返回的cookie) 先跑一遍
        self.reg_login_api.get_img_verify_code(0.123123)
        # 调用类属性(方法级)
        res = self.reg_login_api.get_phone_verify_code(phone,imgVerifyCode)
        #获取响应头信息
        res_headers = res.headers  #可写可不写(题目没要求)
        print(res_headers)
        # 获取字典类型 的响应体数据
        res_dict =res.json()
        logging.info("取短信验证码接口响应体数据:{}".format(res_dict))

        # #断言
        # #断言状态码
        # self.assertEqual(200,res.status_code)
        # #断言status
        # self.assertEqual(200,res_dict.get("status"))
        # #断言description
        # self.assertIn("成功",res_dict.get('description'))

        #公共断言方法     self身份
        utils.common_assert(self,res,exp_status_code,exp_status,exp_description)




    # 注册测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "user_register"))
    def test03_register(self,phone,password,imgVerifyCode,phone_code,dy_server,invite_phone,exp_status_code,exp_status,exp_description):
        #获取图片验证码接受返回的cookie
        self.reg_login_api.get_img_verify_code(0.123123)
        # 获取短信验证码接口返回的cookie
        self.reg_login_api.get_phone_verify_code(phone, "8888")
        #调用类属性
        res = self.reg_login_api.user_register(phone,password,imgVerifyCode,phone_code,dy_server,invite_phone)
        #获取字典类型的响应体数据
        res_dict = res.json()
        logging.info("取注册验证码接口响应体数据:{}".format(res_dict))

        #公共断言
        utils.common_assert(self, res, exp_status_code, exp_status, exp_description)




    # 登录测试用例
    @parameterized.expand(utils.read_json("reg_login_data","user_login" ))
    def test04_user_login(self,phone,password,exp_status_code,exp_status,exp_description):
        #调用类属性
        res =self.reg_login_api.user_login(phone,password)
        #获取字典类型的响应体数据
        res_dict = res.json()
        logging.info("取登录验证码接口响应体数据:{}".format(res_dict))
        #公共断言
        utils.common_assert(self, res, exp_status_code, exp_status, exp_description)

    #登录测试用例-密码错误校验
    def test05_user_login_password_error(self):
        #第一次密码错误,并断言
        res_1 = self.reg_login_api.user_login("13148939905","111111")
        utils.common_assert(self,res_1,200,100,"密码错误1次")
        logging.info("第一次米错误登录接口响应体数据{}".format(res_1.json()))
        # 第二次密码错误,并断言
        res_2 = self.reg_login_api.user_login("13148939905", "111111")
        utils.common_assert(self, res_2, 200, 100, "密码错误2次")
        logging.info("第二次米错误登录接口响应体数据{}".format(res_2.json()))
        # 第三次密码错误,并断言
        res_3 = self.reg_login_api.user_login("13148939905", "111111")
        utils.common_assert(self, res_3, 200, 100, "账号已被锁定")
        logging.info("第一次米错误登录接口响应体数据{}".format(res_3.json()))

        #等待60s
        time.sleep(60)
        #登录成功,并断言
        res_4 = self.reg_login_api.user_login("13148939905", "123456")
        utils.common_assert(self, res_4, 200, 200, "登录成功")
        logging.info("第一次米错误登录接口响应体数据{}".format(res_4.json()))
